export {}

/**
 * 1. 什么是纯函数：
 *    一个函数的返回结果只依赖于它的参数或内部的数据，并且在执行过程里面没有副作用
 *    如果函数的调用参数相同，则永远返回相同的结果，即输入值相同，输出结果肯定相同
 *    返回的结果必须只依赖于其输入参数和内部变量，不依赖于程序执行期间函数外部任何状态或数据的变化，
 *    不能更改传入参数和函数外部的变量
 *    该函数不会产生任何可观察的副作用
 *    纯函数是所有函数式编程语言中使用的概念，是一个非常重要的概念
 *
 * 2. 什么是副作用：
 *    副作用主要体现在纯函数中
 *    当一个功能、一个函数、一个表达式被称为有副作用，通常因为他们更改了外部的一些变量或状态
 *    对于 React 组件来说，主作用就是根据数据（state/props）渲染 UI，除此之外都是副作用（比如，手动修改 DOM）。
 *    常见的副作用 (side effect) 如下：
 *      数据获取、设置订阅、手动更改 React 组件中的 DOM
 *      console.log、修改全局变量、修改函数引用类型的参数（比如，参数是对象）等。
 *      都属于副作用
 */

// ------------------- 案例：1 ---------------------

// 是纯函数，调用参数相同，返回相同结果
const handle1 = (a: number, b: number): number => {
  return a + b
}

handle1(10, 10) // 20
handle1(10, 10) // 20
handle1(10, 10) // 20

// ------------------- 案例：2 ---------------------

// handle2不是纯函数，函数的返回值依赖了外部的数据
const a = 10
const handle2 = () => {
  return a + 10
}

handle2()

// ------------------- 案例：3 ---------------------

// handle3 不是纯函数，更改了外部的参数
let c = 10
const handle3 = (a: number, b: number): number => {
  c++
  return a + b + c
}

handle3(10, 10)

// ------------------- 案例：4 ---------------------

// handle4 不是纯函数，更改了外部的参数
let o: { name?: string } = {}
const handle4 = (a: number, b: number): number => {
  o.name = '亚瑟'
  return a + b
}

handle4(10, 10)
